import { enumObj } from '../../Func/uniFunc/Func';
import { toStringTypeCheck } from '../../Func/uniFunc/Func/toStringTypeCheck';
import { normalizeContainer } from './normalizeContainer';

/**
 * @type{{
  beforeMount: true,
  afterMount: false,
  true: 'beforeMount',
  false: 'afterMount',
}}
 */
const dynamicLoadStatus = enumObj({ true: 'beforeMount', false: 'afterMount' });

/**
 * 为 新创建的 元素 绑定 需要的 位置
 * @param {HTMLElement|null} container 容器 元素
 * @param {HTMLElement|HTMLElement[]} nod 新创建的 元素
 * @param {Boolean|undefined} dynamicLoad undefined 正常 .appendChild || [true|false]  [.insertBefore | .insertAfter]
 * @param {HTMLElement|null} childNode 容器元素 的 定位 子元素 可以为空  .appendChild
 */
function packNode(container, nod, dynamicLoad, childNode) {
  if (toStringTypeCheck(container, 'string'))
    container = normalizeContainer(container);
  // 返回 新创建的元素 本身
  if (container == null) {
    // container = nod;
    return nod;
  }

  if (toStringTypeCheck(nod, 'array')) {
    if (nod.length == 0) return;
    _packNode_Arr(container, nod, dynamicLoad, childNode);
    return;
  } else if (nod instanceof HTMLElement) {
    _packNode(container, nod, dynamicLoad, childNode);
    return;
  }
}

function _packNode_Arr(container, nod, dynamicLoad, childNode) {
  // 如果是 批量的 元素组
  if (nod[0] instanceof HTMLElement) {
    _packNode(container, nod[0], dynamicLoad, childNode);
  } else {
    return;
  }
  for (let i = 1; i < nod.length; i++) {
    if (nod[i] instanceof HTMLElement) {
      // 按序 加载元素
      _packNode(container, nod[i], dynamicLoadStatus.afterMount, nod[i - 1]);
    } else {
      break;
    }
    // return;
  }
}

/**
 * @param {HTMLElement} container
 * @param {HTMLElement} nod
 * @param {Boolean} dynamicLoad [true|false]  [.insertBefore | .insertAfter]
 * @param {HTMLElement|undefined} childNode
 */
function _packNode(container, nod, dynamicLoad, childNode) {
  if (dynamicLoad != undefined) {
    // 将 元素 放置到 给定的 子元素 前
    if (dynamicLoad.toString() == dynamicLoadStatus.beforeMount) {
      container.insertBefore(nod, childNode);
      return;
    }
    // 将 元素 放置到 给定的 子元素 后
    if (dynamicLoad.toString() == dynamicLoadStatus.afterMount) {
      // 如果 子元素 下一个元素 不为空 放置 子元素 下一个元素的 前面
      // if (
      //   childNode instanceof HTMLElement &&
      //   childNode.nextElementSibling != null
      // ) {
      container.insertBefore(nod, childNode.nextElementSibling);
      // container.insertBefore(nod, childNode);

      return;
      // } else {
      //   // 如果 子元素 下一个元素 为空 则 appendChild
      //   container.appendChild(nod);
      // }
    }
  } else {
    // 默认 appendChild
    container.appendChild(nod);
  }
}

export { packNode };
